#include "lcd.h"
Lcd *Lcd::m_instance = NULL;
Lcd::Lcd(const char *dev_path)
{
    init(dev_path);
}
Lcd::~Lcd()
{
    if(fd!=-1)
    {
        ::close(fd);
    }
    if(mp!=MAP_FAILED)
    {
        ::munmap(mp, 800*480*3);
    }
}
void Lcd::init(const char* dev_path) 
{
    // 打开LCD设备（FrameBuffer）
    this->fd = open(dev_path, O_RDWR);  // 读写方式打开
    if(this->fd == -1) perror("[error] lcd open");

    // 映射显存到用户空间
    this->mp = (int*)mmap(
        NULL,               // 让系统自动分配映射的虚拟地址
        800*480*4,          // 映射大小：屏幕分辨率800x480，每个像素4字节（32位）
        PROT_READ|PROT_WRITE,  // 映射区域可读写
        MAP_SHARED,         // 共享映射（修改会同步到物理显存）
        this->fd,           // 设备文件描述符
        0                   // 从设备起始位置开始映射
    );
    if(this->mp == MAP_FAILED) perror("[error] lcd mmap");
}
// 单例接口：首次调用时传入路径，后续调用可不传（复用已创建的实例）
Lcd *Lcd::instance(const char *dev_path)
{
    if(m_instance == NULL)
    {
        m_instance = new Lcd(dev_path);
    }
    return m_instance;
}
//销毁实例
void Lcd::delInstance()
{
    if(m_instance != NULL)
    {
        delete m_instance;
        m_instance = NULL;
    }
}

//返回显存地址
int* Lcd::addr()
{
    return this->mp;
}
//返回文件描述符
int Lcd::getFd()const
{
    return this->fd;
}